#!/usr/bin/env python3
"""
数据库会话管理
"""

from collections.abc import AsyncGenerator
from collections.abc import AsyncGenerator

from sqlalchemy.ext.asyncio.engine import create_async_engine
from sqlalchemy.ext.asyncio.session import AsyncSession
from sqlalchemy.ext.asyncio import async_sessionmaker

from app.core.config import settings

# 创建异步数据库引擎
engine = create_async_engine(settings.DATABASE_URL, echo=settings.DEBUG)

# 创建异步会话工厂
AsyncSessionLocal = async_sessionmaker(
    engine,
    class_=AsyncSession,
    expire_on_commit=False,
    autocommit=False,
    autoflush=False
)


async def get_db() -> AsyncGenerator[AsyncSession, None]:
    """
    获取数据库会话依赖生成器
    
    提供一个异步生成器，用于在FastAPI路径操作函数中获取数据库会话
    自动处理会话的创建、提交、回滚和关闭

    Yields:
        AsyncSession: 异步数据库会话对象，用于数据库操作
    
    Notes:
        - 使用async with在路径操作函数中调用此依赖
        - 会话在yield后会自动提交
        - 发生异常时会自动回滚
        - 无论成功与否，会话最终都会被关闭
    """
    # 创建并管理异步数据库会话
    async with AsyncSessionLocal() as session:
        try:
            # 提供会话给调用方使用
            yield session
            # 调用方完成后自动提交事务
            await session.commit()  # type: ignore[reportUnknownMemberType]
        except Exception:
            # 发生异常时自动回滚事务
            await session.rollback()  # type: ignore[reportUnknownMemberType]
            # 重新抛出异常以便上层处理
            raise
        finally:
            # 确保会话被关闭，释放资源
            await session.close()  # type: ignore[reportUnknownMemberType]
